﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Entities;
using RRHH.Competencias.Controladores;
using System.Data;

namespace WebSite
{
    public partial class ReporteDinamico : System.Web.UI.Page
    {
        protected List<ReporteCampoColumna> ListadoColumnasVisualizar;
        protected List<ReporteCriterioFiltro> ListadoFiltros;
        
        protected string codigoPantalla = "REPORTEDINAMICO";

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                Session["ADUS.ReporteDinamico.ColumnasVisualizar"] = null;
                Session["ADUS.ReporteDinamico.CriteriosFiltro"] = null;

                try
                {
                    this.LimpiarCampos();
                    this.CargarCombos();

                    if (DdlOrigenDatos.Items.Count > 0) this.DdlOrigenDatos_SelectedIndexChanged( null, null );
                }
                catch (Exception ex)
                {
                    this.RegistrarMensajeJavascript( "Error", ex.Message );
                    return;
                }
            }
            else
            {
                if (Session["ADUS.ReporteDinamico.ColumnasVisualizar"] == null)
                    ListadoColumnasVisualizar = new List<ReporteCampoColumna>();
                else
                    ListadoColumnasVisualizar = (List<ReporteCampoColumna>)Session["ADUS.ReporteDinamico.ColumnasVisualizar"];

                if (Session["ADUS.ReporteDinamico.CriteriosFiltro"] == null)
                    ListadoFiltros = new List<ReporteCriterioFiltro>();
                else
                    ListadoFiltros = (List<ReporteCriterioFiltro>)Session["ADUS.ReporteDinamico.CriteriosFiltro"];
            }
        }

        private void LimpiarCampos ()
        {
            GrdOrigenColumnas.DataSource = null;
            GrdOrigenColumnas.DataBind();

            GrdBusquedaVisualizar.DataSource = null;
            GrdBusquedaVisualizar.DataBind();

            GrdBusquedasCriterios.DataSource = null;
            GrdBusquedasCriterios.DataBind();

            ListadoColumnasVisualizar = new List<ReporteCampoColumna>();
            ListadoFiltros = new List<ReporteCriterioFiltro>();

            Session["ADUS.ReporteDinamico.ColumnasVisualizar"] = null;
            Session["ADUS.ReporteDinamico.CriteriosFiltro"] = null;

            this.LimpiarCamposOrden();
           

            GrdResultados.DataSource = null;
            GrdResultados.DataBind();
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        private void LimpiarCamposOrden ()
        {
            LblCampoNombre.Text = string.Empty;
            LblCampoTipo.Text = string.Empty;
            LblCampoDescripcion.Text = string.Empty;

            TxtCondicionDesde.Text = string.Empty;
            TxtCondicionHasta.Text = string.Empty;

            DdlTipoFiltro.Enabled = true;
            DdlTipoFiltro.SelectedIndex = 0;

            DdlTipoCondicion.Enabled = true;
            DdlTipoCondicion.SelectedIndex = 0;
        }

        private int ObtenerNumeroOrden ()
        {
            return ListadoColumnasVisualizar.Count + 1;
        }

        private void ActualizarNumeroOrden ()
        {
            int contador = 0;
            foreach (ReporteCampoColumna Columna in ListadoColumnasVisualizar) Columna.Orden = ++contador;
        }

        private void CompletarGrillaColumnasOrigenDatos ( int numeroPagina )
        {
            ReporteTabla Tabla = new ReporteTabla( Convert.ToInt16( DdlOrigenDatos.SelectedValue ), DdlOrigenDatos.SelectedItem.Text, "" );
            GestorReporteDinamico GReporte = new GestorReporteDinamico();
            List<ReporteCampoColumna> Columnas = GReporte.ObtenerColumnasTabla( Tabla );

            //if (Columnas == null || Columnas.Count == 0) throw new Exception("El origen de datos seleccionado no contiene columnas");

            GrdOrigenColumnas.DataSource = Columnas;
            GrdOrigenColumnas.CurrentPageIndex = numeroPagina;
            GrdOrigenColumnas.DataBind();
        }

        private void CompletarGrillaColumnasFiltro ( int numeroPagina )
        {
            GrdBusquedasCriterios.DataSource = ListadoFiltros;
            GrdBusquedasCriterios.CurrentPageIndex = numeroPagina;
            GrdBusquedasCriterios.DataBind();
        }

        private void CompletarGrillaColumnasVisualizar ( int numeroPagina )
        {
            GrdBusquedaVisualizar.DataSource = ListadoColumnasVisualizar;
            GrdBusquedaVisualizar.CurrentPageIndex = numeroPagina;
            GrdBusquedaVisualizar.DataBind();
        }

        private void CompletarGrillaResultadosBusqueda ( int numeroPagina )
        {
            ReporteTabla Tabla = new ReporteTabla( Convert.ToInt16( DdlOrigenDatos.SelectedValue ), DdlOrigenDatos.SelectedItem.Text, "" );
            GestorReporteDinamico GReporte = new GestorReporteDinamico();

            DataTable tabla = GReporte.ObtenerResultadosConsulta( Tabla, ListadoColumnasVisualizar, ListadoFiltros );

            GrdResultados.PageIndex = numeroPagina;
            GrdResultados.DataSource = tabla;
            GrdResultados.DataBind();
        }

        private void CargarCombos ()
        {
            GestorReporteDinamico GReporte = new GestorReporteDinamico();
            List<ReporteTabla> Listado = GReporte.ObtenerTablasConsulta();

            DdlOrigenDatos.Items.Clear();

            foreach (ReporteTabla Tabla in Listado)
            {
                DdlOrigenDatos.Items.Add( new ListItem( Tabla.Descripcion, Tabla.Codigo.ToString() ) );
            }

            if (DdlOrigenDatos.Items.Count == 0) throw new Exception( "No hay tablas para generar reportes" );
            DdlOrigenDatos.SelectedIndex = 0;
        }

        protected void DdlOrigenDatos_SelectedIndexChanged ( object sender, EventArgs e )
        {
            this.LimpiarCampos();
            if (DdlOrigenDatos.Items.Count == 0) return;

            try
            {
                this.CompletarGrillaColumnasOrigenDatos( 0 );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", ex.Message );
            }
        }

        protected void GrdOrigenColumnas_ItemCommand ( object source, DataGridCommandEventArgs e )
        {
            if (e.CommandName.ToUpper() == "VISUALIZAR")
            {
                ReporteCampoColumna Columna = new ReporteCampoColumna();
                Columna.Nombre = e.Item.Cells[0].Text;
                Columna.Descripcion = e.Item.Cells[1].Text;
                Columna.Tipo = e.Item.Cells[2].Text;
                Columna.Orden = this.ObtenerNumeroOrden();

                if (!ListadoColumnasVisualizar.Contains( Columna )) ListadoColumnasVisualizar.Add( Columna );
                Session["ADUS.ReporteDinamico.ColumnasVisualizar"] = ListadoColumnasVisualizar;

                this.CompletarGrillaColumnasVisualizar( 0 );
            }

            if (e.CommandName.ToUpper() == "FILTRAR")
            {
                ReporteCampoColumna Columna = new ReporteCampoColumna();
                Columna.Nombre = e.Item.Cells[0].Text;
                Columna.Descripcion = e.Item.Cells[1].Text;
                Columna.Tipo = e.Item.Cells[2].Text;

                this.LimpiarCamposOrden();

                LblCampoNombre.Text = Columna.Nombre;
                LblCampoDescripcion.Text = Columna.Descripcion;
                LblCampoTipo.Text = Columna.Tipo.ToUpper();

                this.DdlTipoCondicion_SelectedIndexChanged( null, null );
            }
        }

        protected void GrdOrigenColumnas_ItemDataBound ( object sender, DataGridItemEventArgs e )
        {
            LinkButton botonVisualizar;
            LinkButton botonFiltrar;

            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
                botonVisualizar = (LinkButton)e.Item.Cells[3].Controls[0];
                botonFiltrar = (LinkButton)e.Item.Cells[4].Controls[0];

                botonVisualizar.Text = "Visualizar";
                botonFiltrar.Text = "Filtrar";
            }
        }

        protected void GrdOrigenColumnas_PageIndexChanged ( object source, DataGridPageChangedEventArgs e )
        {
            try
            {
                this.CompletarGrillaColumnasOrigenDatos( e.NewPageIndex );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", ex.Message );
            }
        }

        protected void GrdBusquedaVisualizar_ItemCommand ( object source, DataGridCommandEventArgs e )
        {
            if (e.CommandName.ToUpper() == "QUITAR")
            {
                ReporteCampoColumna Columna = new ReporteCampoColumna();
                Columna.Nombre = e.Item.Cells[0].Text;
                Columna.Descripcion = e.Item.Cells[1].Text;

                ListadoColumnasVisualizar.Remove( Columna );
                Session["SKILL.ReporteDinamico.ColumnasVisualizar"] = ListadoColumnasVisualizar;

                this.ActualizarNumeroOrden();
                this.CompletarGrillaColumnasVisualizar( 0 );
            }
        }

        protected void GrdBusquedaVisualizar_ItemDataBound ( object sender, DataGridItemEventArgs e )
        {
            LinkButton botonQuitar;

            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
                botonQuitar = (LinkButton)e.Item.Cells[3].Controls[0];

                botonQuitar.Text = "Quitar";
            }
        }

        protected void GrdBusquedaVisualizar_PageIndexChanged ( object source, DataGridPageChangedEventArgs e )
        {
            this.CompletarGrillaColumnasVisualizar( e.NewPageIndex );
        }

       

        protected void DdlTipoCondicion_SelectedIndexChanged ( object sender, EventArgs e )
        {
            TxtCondicionDesde.Text = "";
            TxtCondicionDesde.Enabled = true;
            TxtCondicionHasta.Text = "";
            TxtCondicionHasta.Enabled = true;

            RfvCondicionDesde.Visible = true;
            RfvCondicionHasta.Visible = true;
            CmvCondicionDesde.Visible = true;
            CmvCondicionDesde.Type = ValidationDataType.Date;
            CmvCondicionHasta.Visible = true;
            CmvCondicionHasta.Type = ValidationDataType.Date;

            TxtCondicionDesde_CalendarExtender.Enabled = false;
            TxtCondicionHasta_CalendarExtender.Enabled = false;

            CmdCriterioAgregar.Visible = true;

            switch (LblCampoTipo.Text)
            {
                case "TEXTO":
                case "BOOLEANO":
                    CmvCondicionDesde.Type = ValidationDataType.String;
                    CmvCondicionHasta.Type = ValidationDataType.String;
                    break;
                case "NUMERO":
                    CmvCondicionDesde.Type = ValidationDataType.Integer;
                    CmvCondicionHasta.Type = ValidationDataType.Integer;
                    break;
                case "FECHA":
                    TxtCondicionDesde_CalendarExtender.Enabled = true;
                    TxtCondicionHasta_CalendarExtender.Enabled = true;
                    break;
            }

            switch (DdlTipoCondicion.SelectedValue.ToUpper())
            {
                case "EQUALS":
                case "NOTEQUALS":
                    TxtCondicionHasta.Text = "";
                    TxtCondicionHasta.Enabled = false;

                    RfvCondicionHasta.Visible = false;
                    CmvCondicionHasta.Visible = false;

                    if (LblCampoTipo.Text == "BOOLEANO")
                    {
                        TxtCondicionDesde.Enabled = false;

                        if (DdlTipoCondicion.SelectedValue.ToUpper() == "EQUALS") TxtCondicionDesde.Text = "1";
                        else if (DdlTipoCondicion.SelectedValue.ToUpper() == "NOTEQUALS") TxtCondicionDesde.Text = "0";
                    }
                    break;
                case "LIKE":
                    TxtCondicionHasta.Text = "";
                    TxtCondicionHasta.Enabled = false;

                    RfvCondicionHasta.Visible = false;
                    CmvCondicionHasta.Visible = false;

                    if (LblCampoTipo.Text != "TEXTO") CmdCriterioAgregar.Visible = false;
                    break;
                case "BETWEEN":
                    if (LblCampoTipo.Text == "TEXTO" || LblCampoTipo.Text == "BOOLEANO") CmdCriterioAgregar.Visible = false;
                    break;
                case "ISNOTNULL":
                case "ISNULL":
                    TxtCondicionDesde.Text = "";
                    TxtCondicionDesde.Enabled = false;
                    TxtCondicionHasta.Text = "";
                    TxtCondicionHasta.Enabled = false;

                    RfvCondicionDesde.Visible = false;
                    RfvCondicionHasta.Visible = false;
                    CmvCondicionDesde.Visible = false;
                    CmvCondicionHasta.Visible = false;
                    break;
            }
        }

        protected void GrdBusquedasCriterios_ItemCommand ( object source, DataGridCommandEventArgs e )
        {
            if (e.CommandName.ToUpper() == "QUITAR")
            {
                ReporteCampoColumna Columna = new ReporteCampoColumna();
                Columna.Nombre = e.Item.Cells[0].Text;
                Columna.Descripcion = e.Item.Cells[1].Text;
                Columna.Tipo = e.Item.Cells[2].Text;

                ReporteCriterioFiltro Filtro = new ReporteCriterioFiltro( Columna );

                ListadoFiltros.Remove( Filtro );
                Session["SKILL.ReporteDinamico.CriteriosFiltro"] = ListadoFiltros;

                this.CompletarGrillaColumnasFiltro( 0 );
            }
        }

        protected void GrdBusquedasCriterios_ItemDataBound ( object sender, DataGridItemEventArgs e )
        {
            LinkButton botonQuitar;

            if (e.Item.ItemType == ListItemType.Item ||
                e.Item.ItemType == ListItemType.AlternatingItem)
            {
                botonQuitar = (LinkButton)e.Item.Cells[7].Controls[0];

                botonQuitar.Text = "Quitar";
            }
        }

        protected void GrdBusquedasCriterios_PageIndexChanged ( object source, DataGridPageChangedEventArgs e )
        {
            this.CompletarGrillaColumnasFiltro( e.NewPageIndex );
        }

        protected void CmdReporteGenerar_Click ( object sender, ImageClickEventArgs e )
        {
            try
            {
                this.CompletarGrillaResultadosBusqueda( 0 );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo generar el reporte. " + ex.Message );
            }
        }

        protected void CmdReporteCancelar_Click ( object sender, ImageClickEventArgs e )
        {
            this.LimpiarCampos();
            if (DdlOrigenDatos.Items.Count > 0) this.DdlOrigenDatos_SelectedIndexChanged( null, null );
        }

        protected void GrdResultados_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            try
            {
                this.CompletarGrillaResultadosBusqueda( e.NewPageIndex );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", ex.Message );
            }
        }

        protected void CmdCriterioAgregar_Click ( object sender, ImageClickEventArgs e )
        {
            if (LblCampoNombre.Text.Length == 0) return;
            if (LblCampoDescripcion.Text.Length == 0) return;
            if (LblCampoTipo.Text.Length == 0) return;

            ReporteCampoColumna Columna = new ReporteCampoColumna();
            Columna.Nombre = LblCampoNombre.Text;
            Columna.Descripcion = LblCampoDescripcion.Text;
            Columna.Tipo = LblCampoTipo.Text;

            ReporteCriterioFiltro Filtro = new ReporteCriterioFiltro( Columna );
            Filtro.TipoCondicion = DdlTipoCondicion.SelectedValue;
            Filtro.TipoFiltro = DdlTipoFiltro.SelectedValue;
            Filtro.Desde = TxtCondicionDesde.Text;
            Filtro.Hasta = TxtCondicionHasta.Text;

            if (!ListadoFiltros.Contains( Filtro )) ListadoFiltros.Add( Filtro );
            Session["ADUS.ReporteDinamico.CriteriosFiltro"] = ListadoFiltros;

            this.CompletarGrillaColumnasFiltro( 0 );
            this.LimpiarCamposOrden();
        }

        protected void CmdResultadosExportar_Click ( object sender, ImageClickEventArgs e )
        {
            if (GrdResultados.Rows.Count == 0) return;

            try
            {
                GrdResultados.AllowPaging = false;
                this.CompletarGrillaResultadosBusqueda( 0 );

                GridViewExportUtil.ExcelExport( "reportedinamico.xls", GrdResultados );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", ex.Message );
            }
        }

        protected void LkbColumnasSeleccionarTodas_Click ( object sender, EventArgs e )
        {
            List<ReporteCampoColumna> Columnas = null;

            ReporteTabla Tabla = new ReporteTabla( Convert.ToInt16( DdlOrigenDatos.SelectedValue ), DdlOrigenDatos.SelectedItem.Text, "" );
            GestorReporteDinamico GReporte = new GestorReporteDinamico();

            try
            {
                Columnas = GReporte.ObtenerColumnasTabla( Tabla );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error",  ex.Message );
                return;
            }

            ListadoColumnasVisualizar = Columnas;
            Session["ADUS.ReporteDinamico.ColumnasVisualizar"] = Columnas;

            this.ActualizarNumeroOrden();
            this.CompletarGrillaColumnasVisualizar( 0 );
        }

        protected void LkbColumnasEliminarTodas_Click ( object sender, EventArgs e )
        {
            ListadoColumnasVisualizar.Clear();
            Session["ADUS.ReporteDinamico.ColumnasVisualizar"] = ListadoColumnasVisualizar;

            this.CompletarGrillaColumnasVisualizar( 0 );
        }


    }
}